home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (DO)
/
Nibble Volume 12, No. 08 (1991-08)(MindCraft Publishing)(Side B).zip
/
Nibble Volume 12, No. 08 (1991-08)(MindCraft Publishing)(Side B).do
/
MEMORY.PROBE.S
< prev
next >
Wrap
Text File
|
1996-12-24
|
35KB
|
1,094 lines
*****************************
* MEMORY.PROBE *
* by *
* Jim Benedict *
* Copyright 1991 by *
* MindCraft Publ. Corp. *
* Lincoln, MA 01773 *
*****************************
*
* Merlin Assembler
*
*
* Zero Page Addresses
*
PAGE = $00 ;read memory pointer
LENGTH = $2 ;max. length of input
LEFT = $3 ;left edge input
DATALNTH = $7 ;actual length of input
WNDLFT = $20 ;text window
WNDWDTH = $21
WNDTOP = $22
WNDBTM = $23
CH = $24 ;cursor position
CV = $25
BASL = $28 ;screen address
CSWL = $36 ;output hook low byte
PCL = $3A ;disassembly address
A2L = $3E ;for hex conversion
RAMFLAG = $EB ;0=ROM, 1=RAM1, 2=RAM2
RAMBYTE = $EC ;LOB softswitch address
SAVEY = $ED ;preserve Y
INDEX = $F9 ;option index
FORMFLAG = $FA ;0=hex, 1=dec, 2=asc.
MEMFLAG = $FB ;0=main, 1=aux memory
BANKINDX = $FC ;index to bank #'s
BANKSAVE = $FD ;memory bank to access
COUNTER = $FE
STACK = $100
IN = $200 ;input buffer
DOS = $3D0
OURCH = $57B ;80-col CH
*
* Page $C0 addresses
*
KEY = $C000 ;keyboard
STOR80OFF = $C000 ;switch $200-$BFFF
STOR80ON = $C001 ;don't switch display
RAMRDMAIN = $C002 ;read main memory 48K
RAMRDAUX = $C003 ;read aux memory 48K
SETSLOTCXROM = $C006 ;turn on ROM in slots
SETINTCXROM = $C007 ;internal ROM
SETSTDZP = $C008 ;main pages 0,1,$D0-FF
SETALTZP = $C009 ;aux pages 0,1,$D0-FF
STROBE = $C010 ;clear keyboard
SPEAKER = $C030
PAGE2MAIN = $C054 ;text screen main mem.
PAGE2AUX = $C055 ;text screen aux mem.
BANKREG = $C073 ;bank register
READROM = $C082 ;read ROM $D000-$FFFF
READRAM2 = $C080 ;RAM, $D0-DF bank 2
READRAM1 = $C088 ;RAM, $D0-DF bank 1
*
* Monitor addresses
*
PRNTAX = $F941 ;print hex #, AX
PRBLNK = $F948 ;print 3 spaces
PRBL2 = $F94A ;print X spaces
INIT = $FB2F ;initialize system
TABV = $FB5B ;get screen address
VERSION = $FBB3 ;6=//e or c
IDBYTE = $FBC0 ;$EA=//e, $E0=enhanced
;$00=//c
HOME = $FC58 ;clear screen
WAIT = $FCA8 ;(26+27A+5A^2)/2 ms.
CROUT = $FD8E ;output carriage return
PRBYTE = $FDDA ;print hex value of A
COUT = $FDED ;output a char
LIST2 = $FE63 ;disassemble A lines
SETINV = $FE80 ;set inverse mode
SETNORM = $FE84 ;set normal mode
SETVID = $FE93 ;do PR#0
OUTPORT = $FE95 ;PR# A register
GETNUM = $FFA7 ;convert ascii to hex
ZMODE = $FFC7
ORG $8000
*
* Initialize system
*
JSR INIT
LDA #0
JSR OUTPORT
JSR HOME
LDA VERSION ;check machine
CMP #6 ;is it //c or //e?
BEQ CONTINUE ;yes
LDY #0
]LOOP LDA APPLEII,Y ;won't work on II
BEQ DONEII
JSR COUT
INY
BNE ]LOOP ;always
DONEII JSR READKEY ;get a keystroke
JMP ALLDONE ;exit into DOS
CONTINUE LDX #1 ;1 aux. bank (128K)
JSR RTS ;space for READMEM call
STX BANKAVAL+1 ;# of banks available
LDX #$FF ;set stack pointer
TXS ;to protect subroutine
LDY #$0E ;# of bytes in routine
]LOOP LDA STACKSUB,Y ;put read aux memory
STA STACK,Y ;subroutine on stack
DEY
BPL ]LOOP
LDA #0
LDX #5 ;6 bytes
]LOOP STA $F9,X ;clear flags
DEX ;$F9-FE
BPL ]LOOP ;loop through zero
STA PAGE ;default first page
LDA #8 ;is $800
STA PAGE+1
LDA #1 ;default RAM1
STA RAMFLAG ;set it
LDA #$88 ;low order byte of
STA RAMBYTE ;softswitch for RAM1
LDX #3 ;ROM/RAM1/RAM2 for //c
LDA IDBYTE ;//e or //c?
BEQ SETMACH ;//c
INX ;ROM/RAM1/RAM2/SLOT
SETMACH STX MACHINE+1 ;set RAM toggle limit
*
* Print title screen
*
LDA #9 ;set window
STA WNDLFT
LDA #31
STA WNDWDTH
LDA #4
STA WNDTOP
JSR SETCRSR ;put cursor in window
LDY #0
]LOOP LDA TITLE,Y ;print title
BEQ DONETITL
JSR COUT
INY
BNE ]LOOP ;always
DONETITL JSR READKEY ;get keypress
*
* Print data screen
*
LDA #3 ;turn on 80 columns
JSR OUTPORT ;(resets text window)
]LOOP JSR NORMLOP ;print option line
INC INDEX
LDX INDEX
CPX #9 ;done all 9?
BNE ]LOOP ;loop till done
LDX #0
STX INDEX ;default first option
JSR INVRSOP ;print it inverse
JSR PRTDASH ;print dashed line
JSR PRTLONIB ;do low nibble address
LDA #3
STA WNDTOP ;protect options
JSR DOPAGE ;print first page
JSR PRTDASH ;dashes under data
JSR INSTRUCT ;print instructions
*
* Get command
*
MAINLOOP JSR READKEY ;get a key
CMP #$8D ;return?
BEQ COMMAND ;do command
CMP #$88 ;left arrow?
BEQ DECINDEX ;next option left
CMP #$95 ;right arrow?
BEQ INCINDEX ;next option right
CMP #$A0 ;space bar
BEQ TOGGLE ;toggle some values
CMP #$9B ;escape key?
BEQ QUIT ;yes
JSR BELL ;wrong key
BEQ MAINLOOP ;always
*
* Move cursor
*
DECINDEX JSR NORMLOP ;current option normal
DEC INDEX ;new option to left
BPL PRNTOP ;in range, print it
LDX #8 ;reset index
BNE STORIT ;always
INCINDEX JSR NORMLOP ;current option normal
LDX INDEX
INX ;new option to right
CPX #9 ;over maximum?
BNE STORIT ;no
LDX #0 ;reset to zero
STORIT STX INDEX ;new option #
PRNTOP JSR INVRSOP ;print it inverse
JMP MAINLOOP ;get next command
*
* Quit program
*
QUIT JSR BELL
LDA #>QUITMSG ;get message address
LDX #<QUITMSG
JSR MSGOUT ;display message
JSR READKEY ;get keypress
CMP #$9B ;is it ESCAPE?
BEQ ALLDONE ;yes
JSR INSTRUCT ;display instructions
JMP MAINLOOP ;back to main loop
ALLDONE JSR SETVID ;do pr#0
JSR INIT ;clear system
JSR HOME ;clear screen
JMP DOS ;exit into DOS
*
* JSR to proper routine
*
COMMAND LDA INDEX ;get active option #
ASL ;double it
TAY ;index into jump table
LDA CMDTABLE,Y ;get low byte
STA JSRCMD+1 ;put in address
LDA CMDTABLE+1,Y ;get high byte
STA JSRCMD+2 ;put in address
JSRCMD JSR JSRCMD ;do right routine
JMP MAINLOOP ;back to main loop
*
* Toggle some values
*
TOGGLE LDA INDEX ;get active option #
ASL
TAY ;index for toggle table
LDA TOGLTABL,Y
STA JSRTOGL+1
LDA TOGLTABL+1,Y
STA JSRTOGL+2 ;put in address
JSRTOGL JSR JSRTOGL ;do routine
JMP MAINLOOP ;back to main loop
*
* Change page routines
*
NEXTPAGE INC PAGE+1 ;up the address
LDA PAGE+1
CMP #$C0 ;page $C0?
BEQ NEXTPAGE ;yes, skip it
JMP DOPAGE ;print next page
PREVPAGE DEC PAGE+1 ;lower the address
LDA PAGE+1
CMP #$C0 ;page C0?
BEQ PREVPAGE ;yes, skip it
JMP DOPAGE ;print previous page
NEWPAGE LDA #>NEWMSG ;get message address
LDX #<NEWMSG
JSR MSGOUT
STA IN ;zero input
LDX OURCH ;cursor already at
STX LEFT ;left edge input field
LDX #2 ;# of chars allowed
STX LENGTH
JSR INPUT ;get input
BCS CANCEL ;no data or escape
JSR ZMODE ;hex input
JSR GETNUM ;convert to hex data
LDA A2L ;get page number
CMP #$C0 ;page $C0?
BNE ALLSET ;no
JSR BELL ;can't read page $C0
BEQ NEWPAGE ;try again
ALLSET STA PAGE+1 ;save new address
JSR DOPAGE ;display new page
CANCEL JMP INSTRUCT ;replace instructions
*
* Toggle format option
*
FORMAT LDX FORMFLAG ;get format
DEX ;set for next one
BPL STORFORM ;in range
LDX #2 ;reset
STORFORM STX FORMFLAG ;save new format
TXA
ASL
ASL ;0,4,8
TAY ;index into new text
LDX #0 ;index into option line
]LOOP LDA FORMTEXT,Y ;get new text
BEQ DONEFORM
STA FORMATOP,X ;put in option line
INY
INX
BNE ]LOOP ;always
DONEFORM JMP INVRSOP ;update option
*
* Toggle memory option
*
MEMORY LDA MEMFLAG ;get memory status
EOR #1 ;toggle 0/1
STA MEMFLAG ;0=main, 1=aux
BEQ SETY
LDA #5 ;A=0 or 5
SETY TAY ;index into new text
LDX #0 ;index into option line
]LOOP LDA MEMTEXT,Y ;get new text
BEQ CHKBANK
STA MEMORYOP,X ;put in option line
INY
INX
BNE ]LOOP ;always
CHKBANK LDA MEMFLAG ;aux. memory on?
BNE AUXBANK ;yes
LDA #$A0 ;space
STA BANKOP+6 ;blank out bank #
STA BANKOP+7 ;in option text
BNE DOBANK ;always
AUXBANK LDX #0 ;bank 0
JSR SETBANK ;set bank option text
DOBANK INC INDEX ;to print bank option
JSR NORMLOP ;print it
DEC INDEX ;main/aux option
JMP INVRSOP ;print it inverse
*
* Toggle bank number
*
BANK LDX MEMFLAG ;aux. memory on?
BNE OKAYBANK ;yes
JMP BELL ;no bank in main mem.
OKAYBANK LDX BANKINDX ;get current bank index
INX ;toggle increases value
BANKAVAL CPX #0 ;line 109 sets this
BNE BANKOK ;in range, all right
LDX #0 ;reset to start
BANKOK JSR SETBANK ;set option text
JMP INVRSOP ;update option
SETBANK STX BANKINDX ;save new index
LDA BANKTABL,X ;get bank #
STA BANKSAVE ;save it
JSR HEXASC ;convert to ascii
STA BANKOP+6 ;set option text
STX BANKOP+7 ;to new value
RTS
*
* Toggle ROM/RAM1/RAM2/SLOTROM option
*
RAMROM STX SETINTCXROM ;default internal ROM
LDX RAMFLAG ;get current choice
INX ;increase it
MACHINE CPX #4 ;line 133 sets to 3 or 4
BCC RAMOK ;yes
LDX #0 ;reset
RAMOK STX RAMFLAG ;save new index
CPX #3 ;SLOTROM selected?
BNE SKIPROM ;no
STX SETSLOTCXROM ;turn on SLOTROM
SKIPROM LDA BYTETABL,X ;get new address
STA RAMBYTE ;for bank-switch
LDA #0
CLC ;prepare to add
]LOOP DEX ;0 to 3 times
BMI OKY ;A=0,5,10,15
ADC #5 ;add 5 to A
BNE ]LOOP ;loop till finished
OKY TAY ;index into new text
INX ;index into option line
]LOOP LDA RAMTEXT,Y ;get new text
BEQ DONERAM
STA RAMOP,X ;put in option line
INY
INX
BNE ]LOOP ;always
DONERAM JMP INVRSOP ;update option
*
* Disassemble code
*
DISASMBL LDA #>DISMSG ;get message address
LDX #<DISMSG
JSR MSGOUT
LDA PAGE ;move page address
STA PCL ;to disassembly
LDA PAGE+1 ;pointer
STA PCL+1
DEC WNDBTM
DEC WNDTOP ;use all space
* Set up address
DISLOOP LDX #49 ;set cursor to
STX LEFT ;left edge input
LDA #20 ;line 21
JSR SETCRSRX
LDA PCL+1 ;address for disasm.
JSR HEXASC ;convert to ascii
STA IN ;put address in
STX IN+1 ;input buffer as
LDA PCL ;though typed
JSR HEXASC ;so we can accept
STA IN+2 ;or change address
STX IN+3 ;at will
LDA #4
STA LENGTH ;4 chars allowed
JSR INPUT ;get input
BCS QUITDIS ;no data or escape
JSR ZMODE ;convert to hex
JSR GETNUM ;puts value in A2L
LDA A2L+1 ;high byte
CMP #$C0 ;reading $C0 page?
BNE ITSOKAY ;no
JSR BELL ;can't do page $C0
BEQ DISLOOP ;print previous address
ITSOKAY STA PCL+1 ;HOB disassembly
LDA A2L ;low byte
STA PCL ;LOB disassembly
LDA MEMFLAG ;disasm. main only
BEQ GOCHECK ;main mem. on
JSR TOGLMEM ;toggle to main
GOCHECK LDA A2L+1
LDX RAMFLAG
JSR CHECKC0 ;check option line
* Disassemble 34 lines
JSR HOME
LDA #1
JSR SETCRSR ;top line
LDA #17 ;do 17 lines
JSR LIST2 ;monitor disassembler
LDA PCL+1 ;page $C0 check
CMP #$C0 ;reading will crash
BEQ DISLOOP ;so stop
LDA #40
STA WNDLFT ;right column
LDA #1
JSR SETCRSR ;top of window
LDA #17
JSR LIST2 ;do second column
LDA #0 ;reset window
STA WNDLFT
BEQ DISLOOP ;always
QUITDIS LDX PCL+1 ;set PAGE to where
CPX #$C0 ;disassembly left off
BNE SKIP ;but skip page $C0
INX
SKIP STX PAGE+1
JSR INSTRUCT ;display instructions
JSR PRTLONIB ;display low addresses
JMP DOPAGE ;display data
*
* Printer
*
PRINTER JSR DOPAGE ;in case of changes
LDA #>PRNTMSG ;get message address
LDX #<PRNTMSG
JSR MSGOUT
GETKEY JSR READKEY ;read a key
CMP #$8D ;return?
BEQ DUMPIT ;yes
CMP #$9B ;escape key?
BEQ DONEDUMP ;yes
JSR BELL ;wrong key
BEQ GETKEY ;try again
DUMPIT LDA #20
STA WNDTOP ;protect data
LDA #24
STA WNDBTM
JSR HOME ;clear instructions
JSR DBLDUMP ;dump screen
DONEDUMP JMP INSTRUCT ;replace instructions
*
* Check option line
*
OPCHECK LDA PAGE+1 ;check address
LDX RAMFLAG ;get selected RAM/ROM
CMP #$D0 ;less than page $D0?
BCC CHECKC0 ;yes
LDY MEMFLAG ;main memory on?
BEQ D0ANDUP ;pages >$D0
CPX #0 ;aux.memory only
BEQ TORAM1 ;no ROM in aux.mem
CPX #3 ;no SLOTROM in aux.mem
BEQ TORAM1
D0ANDUP CPX #3 ;SLOTROM selected?
BEQ TOROM ;must want ROM
CMP #$E0 ;pages $D0-DF?
BCC DNOPCHK ;yes, any bank okay
CPX #2 ;RAM2?
BNE DNOPCHK ;no, then it's okay
BEQ TORAM1 ;yes, toggle to RAM1
CHECKC0 CMP #$C0 ;pages $00-$BF?
BCC LSTHNC0 ;yes, RAM1 only
LDY MEMFLAG ;$C0-CF, main mem?
BEQ CHEKSLOT ;yes
JSR TOGLMEM ;toggle to main mem.
LDA PAGE+1 ;reset address
LDX RAMFLAG ;reset X
CHEKSLOT CPX #3 ;SLOTROM selected?
BNE CHEKROM ;no
CMP #$C3 ;page $C3?
BEQ TOROM ;yes, don't turn it on
CMP #$C8 ;pages $C8-$CF?
BCS TOROM ;yes, no slots
BCC DNOPCHK ;SLOTROM okay
CHEKROM CPX #0 ;ROM selected?
BEQ DNOPCHK ;yes
LDX #3 ;toggle to ROM
BNE TOROM ;always
LSTHNC0 CPX #1 ;RAM1 selected?
BEQ DNOPCHK ;yes, okay
TORAM1 LDX #0 ;toggle to RAM1
TOROM STX RAMFLAG
JSR TOGLRAM ;toggle to RAM1 or ROM
DNOPCHK RTS ;finished
*
* Display a page of data
*
DOPAGE JSR OPCHECK ;check option line
DEC WNDBTM ;protect bottom dashes
JSR HOME ;clear old data
INC WNDBTM ;restore window bottom
LDA RAMBYTE ;lang. card softswitch
STA BANKSWCH+1 ;to activate right area
STA BANKSWCH2+1
BANKSWCH LDA $C000 ;set lang. card area
LDY #0 ;byte to read
STY COUNTER ;for output loop
LDA MEMFLAG ;main memory?
BEQ READ2 ;yes
LDA PAGE+1 ;check address
CMP #2 ;aux pages 0,1?
BCC READ3 ;yes
CMP #$D0 ;aux pages >=$D0?
BCS READ3 ;yes
READ1 LDA BANKSAVE ;to read aux 48K
STA BANKREG ;set bank to read
JSR STACK ;read a byte
LDX #0 ;reset bank to zero
STX BANKREG
JSR OUTPUT ;print byte
INY
BNE READ1 ;do $FF bytes
BEQ DONEREAD ;all done
READ2 LDA (PAGE),Y ;read main memory
JSR OUTPUT ;print byte
INY
BNE READ2 ;do $FF bytes
BEQ DONEREAD ;all done
READ3 LDA PAGE ;read aux zp area
STA MAINPAGE+1 ;move pointer
LDA PAGE+1 ;from zero page
STA MAINPAGE+2 ;to unswitched memory
]LOOP LDA BANKSAVE ;set bank to read
STA BANKREG
STA SETALTZP ;turn on aux zp
MAINPAGE LDA MAINPAGE,Y ;pointer address
STA SETSTDZP ;turn on main zp
LDX #0 ;reset bank
STX BANKREG
JSR OUTPUT ;print byte
INY ;get next byte
BNE ]LOOP ;for $FF bytes
DONEREAD LDA READROM ;turn on ROM
RTS RTS ;dummy subroutine
* Output a byte to the screen
OUTPUT PHA ;preserve byte
STY SAVEY ;save loop index
LDA READROM ;need ROM for monitor
LDA COUNTER
AND #$0F ;first byte in line?
BNE SKIPADR ;no
LDX #5
JSR PRBL2 ;print 5 spaces
LDA PAGE+1 ;HOB address
LDX COUNTER ;LOB address
JSR PRNTAX ;print address
LDA #":"
JSR COUT ;print colon
SKIPADR LDX FORMFLAG ;what format?
BEQ HEX ;hex mode=0
DEX
BEQ DEC ;decimal mode=1
ASCII PLA ;get char
PHA ;keep it safe
AND #$60 ;send control char
BEQ HEX ;as hex data
JSR PRBLNK ;3 spaces
PLA ;get char
JSR COUT ;print it
JMP DONEOUT ;finished
HEX LDX #2
JSR PRBL2 ;2 spaces
PLA ;get char
JSR PRBYTE ;output the byte
JMP DONEOUT
DEC LDA #$A0
JSR COUT ;1 space
PLA ;get char
JSR DECIMAL ;convert to decimal
LDX #2 ;print 3 digits
]LOOP LDA DECMLBFR,X ;get digit
JSR COUT ;print it
DEX
BPL ]LOOP ;till done
DONEOUT INC COUNTER ;advance counter
LDA COUNTER ;check it
AND #$0F ;take low nibble
BNE BANKSWCH2 ;not done 16 bytes
JSR CROUT ;end of line
BANKSWCH2 LDA $C000 ;reset lang. card
LDY SAVEY ;restore Y for READ
RTS
*
* Subroutines
*
SETCRSR LDX #0 ;left edge
SETCRSRX STX OURCH ;at X
STX CH
JMP TABV ;set vertical from A
INVRSOP JSR SETINV ;print option inverse
NORMLOP LDX INDEX ;get option
LDA CRSRTABL,X ;get CH position
TAX ;put in X
LDA #0 ;top line
JSR SETCRSRX ;set cursor
]LOOP LDA OPTION,X ;read option
BEQ DONEOP
JSR COUT ;print it
INX
BNE ]LOOP
DONEOP JMP SETNORM ;return from there
FLASHOP PHA ;preserve old index
LDA #$FF
JSR WAIT ;wait a moment
JSR NORMLOP ;return to normal
PLA
STA INDEX ;restore index
RTS
PRTDASH LDA #"-" ;prints dashed line
LDX #79 ;80 characters
]LOOP JSR COUT
DEX
BPL ]LOOP
RTS
INSTRUCT LDA #>HELPMSG ;get message address
LDX #<HELPMSG
MSGOUT STA MESSAGE+2 ;put address in place
STX MESSAGE+1
LDA #24 ;open message window
STA WNDBTM
LDA #20 ;center messages
STA WNDLFT
LDA #60
STA WNDWDTH
LDA #20
STA WNDTOP ;close data display
JSR HOME ;clear mesage window
LDY #0
MESSAGE LDA MESSAGE,Y ;address installed here
BEQ DNMSG
JSR COUT
INY
BNE MESSAGE ;always
DNMSG LDA #20 ;close message window
STA WNDBTM
LDA #3 ;open data display
STA WNDTOP
LDA #80
STA WNDWDTH
LDA #0 ;left edge to zero
STA WNDLFT
RTS
READKEY LDA KEY ;read keyboard
BPL READKEY ;wait for keypress
BIT STROBE ;clear board
RTS
INPUT LDX #0
INSTART STX COUNTER ;save cursor location
LDX LEFT
STX CH
STX OURCH ;set cursor to start
LDX #$FF ;start with first char
LDY #$FF ;start at length zero
]LOOP INY
INX
CPX LENGTH ;all done?
BEQ DONE ;yes
LDA IN,X ;get byte
BNE NORMAL ;not terminator, okay
LDA #"_" ;underline for the rest
NORMAL ORA #$80 ;(BASIC stores as inverse)
PRINTIT JSR COUT ;print a char
STA IN,X ;put in buffer
CMP #"_" ;doing underline?
BNE ]LOOP ;no, continue
INX ;add one to count
CPX LENGTH ;done?
BNE PRINTIT ;finish underline
DONE LDA #0
STA IN,X ;terminator
STY DATALNTH ;length of data
FLSHCRSR LDX COUNTER ;position within input
LDA IN,X ;get char
BNE NOTEND ;not beyond data
LDA #$A0 ;flash space cursor
NOTEND PHA ;save normal char
EOR #$80 ;make inverse
JSR FLASH ;print inverse cursor
PLA ;retrieve char
JSR FLASH ;print normal char
BPL FLSHCRSR ;until a key pressed
LDY DATALNTH ;restore Y
LDX COUNTER ;restore X
BIT STROBE ;clear board
CMP #$8D ;return key?
BEQ RETURN ;yes
CMP #$95 ;right arrow?
BEQ FORWARD
CMP #$88 ;left arrow?
BEQ BACKUP
CMP #$84 ;control-D?
BEQ BACKUP
CMP #$FF ;delete key?
BEQ BACKUP
CMP #$9B ;escape key?
BEQ SETFLAG
CMP #$A0 ;is it a char?
BCS PROCESS ;yes
OOPS JSR BELL ;sorry
BEQ FLSHCRSR ;try again
JMPSTART BPL INSTART ;bridge to INSTART
BACKUP CPX #0 ;at left edge?
BEQ FLSHCRSR ;yes, ignore command
DEX ;move cursor left
CMP #$88 ;left arrow?
BEQ INSTART ;back up only
STX COUNTER ;preserve location
]LOOP INX ;get char to right
LDA IN,X ;and move it
DEX ;one to left
STA IN,X
INX ;go to next spot
CPX LENGTH ;done?
BNE ]LOOP ;no
LDX COUNTER ;restore location
BPL JMPSTART ;print new data
FORWARD CPX DATALNTH ;cursor at end of data?
BCC ADVANCE ;no
BEQ FLSHCRSR ;yes, but no bell
PROCESS CPX LENGTH ;cursor at end of data?
BEQ OOPS ;yes
CMP #"0" ;is it a number?
BCC OOPS ;no
CMP #$BA ;range 0-9?
BCC RIGHT ;yes, these okay
CMP #"G" ;above F?
BCS OOPS ;yes, wrong key
CMP #"A" ;below A?
BCC OOPS ;yes, wrong again
RIGHT STA IN,X ;put it in at cursor
ADVANCE INX ;move cursor to right
BPL JMPSTART ;always
RETURN CPY #0 ;any data?
BEQ SETFLAG ;no
CLC ;clear carry
RTS
SETFLAG SEC ;set carry flag
RTS ;done input routine
FLASH PHA ;save char
CLC
LDA COUNTER ;add cursor location to
ADC LEFT ;input location to get
STA CH ;right spot on screen
STA OURCH
PLA ;get char back
JSR COUT ;print char
LDY #$60 ;pause
YLOOP LDX #$FF ;flash rate
XLOOP LDA KEY ;key pressed?
BMI DONEFLSH ;yes
DEX ;loop
BNE XLOOP
DEY
BNE YLOOP
DONEFLSH RTS
HEXASC PHA ;preserve char
AND #$0F ;take low nibble
JSR CONVERT ;convert to ascii
TAX ;put in x register
PLA ;retrieve char
LSR ;shift high nibble
LSR ;into low nibble
LSR
LSR
CONVERT ORA #$B0 ;convert to ascii
CMP #$BA ;a number?
BCC DONEHEX ;yes
ADC #6 ;add 6 + carry (A-F)
DONEHEX RTS ;returns A=high nibble
;X=low nibble
DECIMAL LDY #$B0 ;zero buffer (ascii)
STY DECMLBFR+1 ;enter with hex byte
STY DECMLBFR+2 ;in the accumulator
LDY #0
]LOOP SEC ;prepare to subtract
LDX #$FF ;count from zero
COUNT INX
SBC #10 ;count # of 10's
BCS COUNT ;keep track in X
ADC #10 ;subtracted 10 too many
ORA #$B0 ;convert to ascii
STA DECMLBFR,Y ;the decimal digit
INY ;do the next digit
TXA ;how many 10's
BNE ]LOOP ;if x=0 then no more
RTS
PRTLONIB LDA #2
JSR SETCRSR ;set cursor
LDY #0
]LOOP LDA ADDRESS,Y ;print "Addrs:"
BEQ PRTDIGIT
JSR COUT
INY
BNE ]LOOP
PRTDIGIT JSR SETINV ;in inverse
TAY ;start with 0
]LOOP JSR PRBLNK ;print 3 spaces between
TYA ;from 0-15
JSR HEXASC ;convert to ascii
TXA ;print low nibble
JSR COUT ;hex 0-F
INY
CPY #$10 ;done?
BNE ]LOOP ;no
JMP SETNORM ;return from there
TOGLMEM JSR BELL ;changing option
LDA INDEX ;get current option
PHA ;preserve it
LDA #4 ;option # for
STA INDEX ;memory option
JSR MEMORY ;toggle to main
PLA ;get current option #
CMP INDEX ;was it memory?
BEQ DONETOG1 ;yes, leave it inverse
JMP FLASHOP ;no, back to normal
DONETOG1 RTS
TOGLRAM JSR BELL ;changing RAM option
LDA INDEX ;get current option #
PHA ;preserve it
LDA #6 ;option # for RAM/ROM
STA INDEX
JSR RAMROM ;toggle it to value
PLA ;retrieve current index
CMP INDEX ;is it RAM/ROM?
BEQ DONETOG2 ;yes, leave it inverse
JMP FLASHOP ;no, return to normal
DONETOG2 RTS
BELL LDX #10 ;a little beep
]LOOP1 LDY #10 ;change values to
]LOOP2 TYA ;suit yourseelf
JSR WAIT
BIT SPEAKER
DEY
BNE ]LOOP2
DEX
BNE ]LOOP1
RTS
STACKSUB STA STOR80OFF ;switch all $200-BFFF
STA RAMRDAUX ;read aux memory
LDA (PAGE),Y ;read a byte
STA RAMRDMAIN ;read main memory
STA STOR80ON ;protect aux text pages
RTS
*
* Screen Dump Routine
*
DBLDUMP LDA CV
PHA ;save cursor
LDA CSWL+1 ;save CSW on stack
PHA
LDA CSWL
PHA
LDX #$C1 ;for slot 1
STX CSWL+1 ;put in CSW
LDX #0 ;low byte
STX CSWL
STX COUNTER ;zero line counter
INITPTR INX
LDA PTRINIT-1,X ;init parallel printer
BEQ SCRNLOOP ;when done
JSR COUT
BNE INITPTR ;get next char
SCRNLOOP JSR TABV ;get screen address
LDY #00 ;counter to zero
LINELOOP BIT PAGE2AUX ;turn on aux memory
LDA (BASL),Y ;byte from aux page
PHP ;save status
BIT PAGE2MAIN ;turn on main memory
PLP ;restore status
JSR DOBYTE ;process the byte
LDA (BASL),Y ;byte from main mem
JSR DOBYTE ;process the byte
INY ;increment counter
CPY #40 ;done 80 characters?
BCC LINELOOP ;no, do the next
JSR CROUT ;send carriage return
INC COUNTER ;increment line counter
LDA COUNTER ;check if done
CMP #24 ;done 24 lines?
BCC SCRNLOOP ;loop till done
PLA
STA CSWL ;restore CSW
PLA
STA CSWL+1
PLA ;get cursor location
TAX
DEX
BEQ TOP ;at top of screen
DEX
TOP STX CV ;restore cursor
RTS
* Transform byte for printer
DOBYTE BMI HIBIT ;high bit ascii
LDX IDBYTE ;check identity
CPX #$EA ;unenhanced IIe?
BEQ SETHIBIT ;yes, set high bit
CMP #$40 ;@ thru ? inverse
BCC MAINCHAR ;same as main chars
CMP #$60 ;lower case inverse
BCC NULL ;mousetext
SETHIBIT ORA #$80 ;set high bit
HIBIT CMP #$FF ;delete char?
BEQ NULL ;don't send that
CMP #$A0 ;control char?
BCS SENDIT ;no, then it's okay
NULL LDA #$A0 ;space
BMI SENDIT ;always taken
MAINCHAR ORA #$C0 ;ascii in range $C0-$FF
CMP #$E0
BCC SENDIT ;$C0-DF, @ to underline
EOR #$40 ;$A0-BF, space to ?
SENDIT JSR COUT
RTS
* Parallel printer initialization code
PTRINIT HEX 89 ;ctrl-I
ASC "80N"
HEX 8D00
*
* Option line
*
OPTION ASC "Next Page"8D00
ASC "Prev.Page"8D00
ASC "New Page"8D00
FORMATOP ASC "Hex"8D00
MEMORYOP ASC "Main Memory"8D00
BANKOP ASC "Bank $ "8D00 ;2 spaces
RAMOP ASC "RAM1"8D00
ASC "Disasm"8D00
ASC "Print"8D00
* Replacement text
FORMTEXT ASC "Hex"00
ASC "Dec"00
ASC "Asc"00
MEMTEXT ASC "Main"00
ASC "Aux."00
RAMTEXT ASC "ROM "00 ;1 space
ASC "RAM1"00
ASC "RAM2"00
ASC "SLOT"00
TITLE INV "----------------------"8D3E ;22 hyphens
ASC " "3C8D3E ;20 spaces
ASC " MEMORY.PROBE "3C8D3E
ASC " By Jim Benedict "3C8D3E
ASC " Copyright 1991 by "3C8D3E
ASC "MindCraft Publ.Corp."3C8D3E
ASC " Lincoln, MA 01773 "3C8D3E
ASC " "3C8D ;20 spaces
INV "----------------------"8D8D ;22 hyphens
ASC "Press a key..."8D00
NEWMSG ASC "Enter a two-digit hex number "
ASC "(e.g. $FD)"8D
ASC "<ESC> cancels. ENTER PAGE: $"00
HELPMSG ASC "Arrows <-- --> change "
ASC "highlighted option."8D
ASC "Space bar toggles format "
ASC "and memory options."8D
ASC "Press <RETURN> to display data, "
ASC "<ESC> to quit."8D00
ADDRESS ASC " Address:"00 ;2 spaces
PRNTMSG ASC "<RETURN> dumps screen to printer."8D
ASC "<ESC> cancels. Enter selection:"00
DISMSG ASC "<RETURN> to accept address: $"8D
ASC "<ESC> cancels disassembly."8D00
QUITMSG ASC "Press <ESC> to quit the program."8D
ASC "Any other key returns to program."8D00
APPLEII ASC "MEMORY.PROBE REQUIRES A //E OR //C."8D8D
ASC "PRESS ANY KEY TO CONTINUE."8D00
*
* Tables
*
CMDTABLE DA NEXTPAGE
DA PREVPAGE
DA NEWPAGE
DA DOPAGE ;display data
DA DOPAGE
DA DOPAGE
DA DOPAGE
DA DISASMBL
DA PRINTER
TOGLTABL DA RTS ;no toggle this option
DA RTS ;dummy subroutine
DA NEWPAGE
DA FORMAT
DA MEMORY
DA BANK
DA RAMROM
DA RTS
DA RTS
DECMLBFR HEX 000000 ;3 bytes
BYTETABL HEX 82888082 ;LOB softswitch address
CRSRTABL HEX 000B162025323C424A
BANKTABL HEX 0000000000000000 ;READMEM puts
HEX 0000000000000000 ;bank #'s here
*
* Find memory banks of aux. slot cards
*
READMEM STA SETALTZP ;turn on alternate zp
LDX #0 ;bank counter
LDY #0 ;start at bank 0
]LOOP STY BANKREG ;turn on bank
STY COUNTER ;write a byte
CPY COUNTER ;read it
BNE NOBANK ;not same, no bank
TYA ;put bank # in A
STA BANKTABL,X ;save it in table
INX
NOBANK INY ;check next bank
CPY #$10 ;done 16?
BNE ]LOOP ;no
LDY #0
STY BANKREG ;set bank to zero
STA SETSTDZP ;turn on main zp
RTS